home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / e / amigae30a_fr.lha / AmigaE30f / Sources / Lang / NGRC.doc < prev    next >
Encoding:
Text File  |  1994-09-05  |  11.7 KB  |  333 lines

  1.  
  2. +-----------------------------------------------------------------------+
  3. |                      Manuel de Noise Compiler v1.0                    |
  4. +-----------------------------------------------------------------------+
  5.                          par Wouter van Oortmerssen
  6.  
  7.  
  8. Brêve : Le compilateur noise est un programme qui traduit les fichiers sources
  9.         de type 'langage de programmation de musique' en fichiers compatibles
  10.         Noise/ProTracker (tm).
  11.  
  12. Matériel nécessaire : n'importe quel Amiga (tm).
  13.          recommandé : 1 ou 2 méga de mémoire vive, un disque dur, un sampler.
  14.  
  15. La grammaire de noise peut être décrit comme suit :
  16.  
  17.         - Une grammaire à contexte large (context free grammar),
  18.         - Un langage de programmation pour la musique,
  19.         - Un formalisme spécifique pour la musique.
  20.  
  21. Il peut être utilisé comme :
  22.  
  23.         - Un programme de musique,
  24.         - Langage de spécification pour des structures de musique,
  25.         - Un outil expérimental pour générer de la musique
  26.  
  27. +-----------------------------------------------------------------------+
  28. |                       La Grammaire de Noise                           |
  29. +-----------------------------------------------------------------------+
  30.  
  31. Le compilateur noise lit les sources ASCII contenant une description d'un
  32. morceau de musique, découpe le texte dans un 'arbre syntaxique', et commence
  33. à générer une séquence de notes en lisant récursivement votre définition.
  34. Finallement, il chargera tous les samples et écrira les données vers un
  35. fichier ProTracker (tm).
  36.  
  37. Un programme noise (suffixe .ngr) consiste en un nombre illimité de 'règles'
  38. (ça vous aidera, si vous connaissez déja un peu la grammaire à context large
  39. [context-free grammar]). Chaque règle ressemble à ça :
  40.  
  41. <sym> "->" <symlist> ";"
  42.  
  43. (NOTE : J'utilise une notation informelle, tant la programmation ressemble
  44.         au langage lui-même. J'utilise :
  45.         <> pour signaler un mot qui doit être remplacé par quelques ligne ASCII,
  46.         "" pour les chaines qui doivent être pris telles-quelles)
  47. Exemple:
  48.  
  49. beat -> drum [C#,1]                     /* a C-flat */
  50.         { [D,2] | [D#,2] | [Db,2] }     /* D, D-sharp, D-flat */
  51.         ( boomboom 1 );                 /* index=1 */
  52.  
  53. Chaque mot (token) doit être séparé par un espace, qui différencie un quelconque
  54. nombre d'espaces/tabulations/saut de ligne, et les commentaires, commençant
  55. par '/*' et finissant par '*/'.
  56.  
  57. Un <symlist> est un ou plusieurs <item>s. Un <item> peut être :
  58.  
  59.         <sym> <index>
  60.  
  61. sera remplacé récursivement par la définition de <sym>.
  62. <index> est optionnel et est expliqué plus loin.
  63. exemple : drum
  64.  
  65.         "(" <weight> <symlist> ")"
  66.  
  67. comme <sym>, seulement un <weight> optionnel ( par défault = 500, compris entre
  68. 0 et 1000) spécifie la 'chance' de <symlist> d'être reécrit, avec 0 aucune
  69. chance.
  70. Exemple :
  71.  
  72. (beat)          (250 beat)
  73.  
  74. decide pendant la génération, si la définition de 'beat' doit être ou non jouée
  75. , respectivement 50% et 25% de chance.
  76.  
  77.         "{" <weight> <symlist> "|" ..... "}"
  78.  
  79. Tous les <symlist> doivent être entre {} et être séparé par |.
  80. <weight> est encore là optionnel, et doit être entre 0 et 1000, seulement
  81. maintenant la valeur par défaut est 1. Sans <weight>, simplement un des
  82. <symlist> est pris.
  83. Exemple :
  84.  
  85. { beat | boomboom | [Gb+,4] }           /* chances: each 33% */
  86. { 3 beat | 7 boomboom }                 /* chances: 30%,70% resp. */
  87.  
  88.         <samplename> <vol>
  89.  
  90. un chemin AmigaDos vers un sample, <vol> est un entier optionnel, entre 0 et
  91. 64.
  92. Exemple: "samples:guitar.iff"
  93.  
  94.         "[" <note> "," <duration> "]"
  95.  
  96. un note spécifiée, voir plus bas.
  97.  
  98.         <hexinteger>
  99.  
  100. un effet spécial, voir plus bas.
  101.  
  102.  
  103. NOTES.
  104. ------
  105.  
  106. une <note> est un caractère comme :  C D E F G A B
  107. elle peut être suivit par un nombre quelconque de modificateur :
  108.  
  109. "#" = dièse
  110. "b" = bémol
  111. "+" = octave supérieure
  112. "-" = octave inférieure
  113.  
  114. en général, vous pouvez indiquer seulement une octave en plus ou en moins,
  115. et le programme retournera une erreur si vous écrivez 'E+++' par exemple.
  116. Autant de '#' et de 'b' sont permis, seulement en général vous écrirez plutôt
  117. 'D' pour 'C##', or 'F' pour 'E#'etc. Notez que cette version de noise n'accepte
  118. seulement pour 'C-major'.
  119. Exemple :
  120.  
  121. C       C (celui au milieu du piano)
  122. C#+     C-dièse, une octave en haut
  123. Dbb-    C une octave en bas
  124.  
  125. pour ceux qui ne sont pas familiés avec les notes classiques (anglaise), une
  126. note est définie par des entiers de -12 à 23, avec 0 pour le C du milieu,
  127. une note négative indique un note plus basse.
  128.  
  129. La durée <duration> est un entier indiquant le temps en unité entre 1 et 100
  130. pour jouer la note, avec de jouer la suivante.
  131. Un unité est environ un quart de note, ainsi une note entière doit être
  132. écrit '4' etc.
  133. exemples :
  134. [C,1]
  135. [F#,4]           /* un F-dièse d'une seconde */
  136.  
  137.  
  138. EFFETS SPECIAUX.
  139. ----------------
  140.  
  141. de nombreux effets spéciaux peuvent être utilisés sous forme d'entiers
  142. héxadécimaux. Un effet ne peut uniquement être utilisé qu'avec la note
  143. suivante.
  144. exemple :
  145.  
  146. mainpart -> $E01 drums solo drums
  147.  
  148. éteint le filtre audio avant de jouer. Rappel des effets :
  149.  
  150. ----------------------------------------------------------------------------
  151. 0 - Normal play or Arpeggio             0xy : x-first halfnote add, y-second
  152. 1 - Slide Up                            1xx : upspeed
  153. 2 - Slide Down                          2xx : downspeed
  154. 3 - Tone Portamento                     3xx : up/down speed
  155. 4 - Vibrato                             4xy : x-speed,   y-depth
  156. 5 - Tone Portamento + Volume Slide      5xy : x-upspeed, y-downspeed
  157. 6 - Vibrato + Volume Slide              6xy : x-upspeed, y-downspeed
  158. 7 - Tremolo                             7xy : x-speed,   y-depth
  159. 9 - Set SampleOffset                    9xx : offset (23 -> 2300)
  160. A - VolumeSlide                         Axy : x-upspeed, y-downspeed
  161. C - Set Volume                          Cxx : volume, 00-40
  162. E - E-Commands                          Exy : see below...
  163. F - Set Speed                           Fxx : speed (00-1F) / tempo (20-FF)
  164. ----------------------------------------------------------------------------
  165. E0- Set Filter                          E0x : 0-filter on, 1-filter off
  166. E1- FineSlide Up                        E1x : value
  167. E2- FineSlide Down                      E2x : value
  168. E3- Glissando Control                   E3x : 0-off, 1-on (use with tonep.)
  169. E4- Set Vibrato Waveform                E4x : 0-sine, 1-ramp down, 2-square
  170. E5- Set Loop                            E5x : set loop point
  171. E6- Jump to Loop                        E6x : jump to loop, play x times
  172. E7- Set Tremolo Waveform                E7x : 0-sine, 1-ramp down. 2-square
  173. E9- Retrig Note                         E9x : retrig from note + x vblanks
  174. EA- Fine VolumeSlide Up                 EAx : add x to volume
  175. EB- Fine VolumeSlide Down               EBx : subtract x from volume
  176. EC- NoteCut                             ECx : cut from note + x vblanks
  177. ED- NoteDelay                           EDx : delay note x vblanks
  178. EF- Invert Loop                         EFx : speed
  179. ----------------------------------------------------------------------------
  180.  
  181.  
  182. INDEXATION.
  183. -----------
  184.  
  185. Alors que () et {|||} sont des moyens pratiques de générer une musique
  186. totallement au hasard, ou de rendre de votre morceau de musique plus naturel,
  187. dû à quelques variations. Certains préfèrent souvent avoir le choix du hasard
  188. répété : par exemple, si vous définissez un symbole 'beat' que vous voulez
  189. réutiliser dans certaines parties de votre programme, et la définition contient
  190. des variations 'au hasard', vous voulez avoir le hasard fixé la seconde fois,
  191. parce qu'il sera completement hasrdeux sinon. Par exemple, considerez la pseudo
  192. définition de 'beat' ci-dessous.
  193.  
  194. beats -> beat boomboom beat boomboom;
  195.  
  196. Ca ressemble à un rythme normal, mais 'beat' est remplacé par 2 différentes
  197. séquences de notes. A savoir :
  198.  
  199. beats -> beat1 boomboom2 beat1 boomboom2;
  200.  
  201. vous spécifiez qu'avec le premier 'beat', le choix du hasard est enregistré
  202. et tous les autres qui sont de même indéxés auront leurs notes générés de la
  203. même facon que la première note. Notez que cela ne marche pas avec les samples
  204. par ex. :
  205.  
  206. beats -> "bass.iff" beat1 "hihat.iff" beat1;
  207.  
  208. générera 2 même séquences, mais joué par des instruments différents.
  209.  
  210. SYMBOLES AND CANALS.
  211. ---------------------
  212.  
  213. Un symbole consiste en un nombre de caractères en minuscules. Comme
  214. l'amiga joue sur 4 canaux simultanément, il n'y a pas un symbole de départ
  215. pour la grammaire, mais 4, appelés : 'one', 'two', 'three', 'four'.
  216. Enfin, l'un d'eux doit être définis dans la grammaire.
  217. Exemple :
  218.  
  219. one -> "dat:noiz/Dguitar" 20 aa1;
  220. two -> "dat:noiz/drumz/bassdrum" aa1;
  221.  
  222. aa -> a $E00 a $E01 a a;
  223.  
  224. a -> { c d c c d d | d d | c d c d | c c };
  225.  
  226. c -> [C,1] [C#,3];
  227. d -> [D,2] [D,3];
  228.  
  229. joue la séquence 'aa' simultanément sur 2 canaux, avec 2 instruments
  230. différents, avec des volumes de 20 et 64. La séquence 'aa' consiste en
  231. plusieurs 'a', pendant qu'on change le filtre. 'a' consiste en 4 séquences
  232. possibles, qui sont les notes à jouer. NOTE : n'essayez pas ces exemples,
  233. ce ne sont pas des morceau de musique, mais des 'exemples'.
  234.  
  235.  
  236. CRÉATION DE MORCEAUX DE MUSIQUES (TUNES).
  237. -----------------------------------------
  238. La création de votre musique peut être réalisée de 2 façons :
  239. de bas en ahut ou de haut en bas...
  240. Dans le second cas vous aurez une idée à quoi doit ressembler votre musique :
  241. vous écrivez les structures globales de la chanson, et pas à pas sortez les
  242. symboles à jouer.
  243. Dans le premier cas, vous pouvez définir des symboles, chacuns étant une
  244. séquence de note, et ainsi construire des blocs plus grands pour créer votre
  245. musique.
  246. Par exemple, pour un petit morceau de guitar, vous commencrez par la
  247. définition de 2 notes, a et b
  248.  
  249. a -> [D,1] [E,3];
  250. b -> [D,1] [D#,7];
  251.  
  252. Puis, vous les combinerez en une séquence :
  253.  
  254. c -> a a a b;
  255.  
  256. Finallement, vous les jouerez sur le canal 1, et définissez un sample :
  257.  
  258. one -> guitar c c c a [C,16];          /* just one channel */
  259.  
  260. /* l'instrument */
  261. guitar -> "dat:noiz/Dguitar";
  262.  
  263. Notez que les notes seront joués par l'instrument au moment où elles sont
  264. rencontrés dans la grammaire.
  265.  
  266. Exemple:
  267.  
  268.  
  269. /* "gaspits.ngr":
  270.    gaspits qui fait le bruit des vibrations d'un réfrégirateur,
  271.    combiné à d'autres instruments */
  272.  
  273. gaspits -> "dat:noiz/gaspits";         /* les samples */
  274. drum -> "dat:noiz/drumz/bassdrum" 50;
  275. guitar -> "dat:noiz/dguitar" 32;
  276.  
  277.  
  278. one -> gaspits c;                      /* joue la règle "c", canal 1 */
  279.  
  280. a -> [C,4] [D,8];
  281. b -> [E,2] [E,2] [D#,8];
  282.  
  283. c -> a b [E-,16]
  284.      a b [E-,16]
  285.        b [D#-,8];
  286.  
  287.  
  288. two -> drum f;                         /* drums sur canaux 2 and 3 */
  289. three -> drum [C,1] f;
  290.  
  291. d -> g [C,2] [C,2];
  292. e -> g [C,1] [C,1] [C,1] [C,1];
  293.  
  294. f -> d e d e d e;
  295.  
  296. g -> [C,4] [C,4] [C,4];
  297.  
  298.  
  299. four -> guitar [Fb-,64] [F-,64];       /* guitare sur canal 4 */
  300.  
  301.  
  302.  
  303.  
  304. UTILISATION DU HASARD
  305. ---------------------
  306. Vous pouvez utiliser le hasard pour donner des variations subtiles à votre
  307. morceau des musique, avec :
  308.  
  309. mynote -> { 10 [D,2] | 1 [D#,2] | 1 [Db,2] };
  310.  
  311. On définie une note qui est jouée comme un 'D' la plupart du temps, mais
  312. occasionnellement douce ou piquée. On peut facilement faire la même chose avec
  313. la durée, ou même avec l'ordre de certaines séquences jouées.
  314. En tout cas, n'espérez pas un hasard pur : le hasard est généré par la
  315. fonction de l'ordinateur, qui ne peut être parfait (du moins dans cette
  316. impléméntation). par ex. quand vous spécifiez 80% 10% 10%, en réalité vous
  317. aurez 75% 5% 20%.
  318.  
  319. Vous pouvez alors créer des musiques au hasard : vous avez à spécifier
  320. seulement ce que le morceau doit être, seulement au points cruciaux vous
  321. laissez l'ordinateur décider : vous aurez certainement envie de compiler
  322. plusieurs fois la grammaire, pour voir se qui sonne le mieux, et trouver
  323. d'étrange mais interressant sons, que vous n'auriez pas suspecté !
  324.  
  325. ---------------------------------------------------------------------
  326.  
  327.  
  328. Contactez l'auteur :
  329.  
  330.         Wouter@alf.let.uva.nl
  331.         Wouter@mars.let.uva.nl
  332.         Oortmers@gene.fwi.uva.nl
  333.